package locadora.model;

import java.util.List;

/**
 * Interface que possui as operações de uma Locadora
 *
 * @author Leonardo Rocha Dias
 * @author Marccelo Augusto Selvaggio
 * @version 9.11-09
 * @see LocadoraImplementacao
 * @since 2009
 */
public interface Locadora {

    /**
     * Adiciona um novo item, tanto filme quanto jogo, à locadora
     *
     * <p>
     * ADICIONAR ITEM: adiciona um item de locação ao acervo da locadora.
     * Um item de locação pode ser um jogo ou um filme.
     * Ambos devem conter um nome (String), o jogo deve conter a plataforma
     * (uma String) e o filme o ano de lançamento (int).
     * Para simplificar, considere que só existe 1 única cópia de cada item.
     * </p>
     *
     * @param item, o item que será adicionado
     */
    public void addItem(ItemLocacao item);

    /**
     * Adiciona um novo cliente à locadora
     *
     * <p>
     * ADICIONAR CLIENTE: adiciona um cliente à locadora.
     * Um Cliente deve conter um nome (String) e um Código (String).
     * Ele deve ser único pelo Código.
     * </p>
     *
     * @param cliente, o cliente que será adicionado
     * @return verdadeiro se não existir um cliente com mesmo código 
     * ou falso caso contrário
     */
    public boolean addCliente(Cliente cliente);

    /**
     * Lista todos os clientes da locadora
     *
     * LISTAR CLIENTES: devolve uma List com todos os clientes da locadora.
     *
     * @return uma coleçao com todos os clientes
     */
    public List<Cliente> listarClientes();

    /**
     * Lista todos os itens da locadora
     *
     * LISTAR ACERVO: devolve uma List com todos os itens que a locadora
     * disponibiliza para locação.
     *
     * @return uma coleçao com todos os itens(filme, jogo) do acervo
     */
    public List<ItemLocacao> listarAcervo();

    /**
     * Adiciona um item ao cliente
     *
     * <p>
     * ADICIONAR ITEM AO CLIENTE: adiciona um item de locação ao cliente.
     * Um cliente mantém uma lista de no máximo 10 itens pelos quais tem
     * interesse em locar, em ordem de prioridade. O de mais alta prioridade
     * deve ser alugado primeiro. O novo item é adicionado sempre ao final da
     * lista, ou seja, como prioridade mais baixa e não pode haver itens
     * repetidos na lista do cliente.
     * </p>
     *
     * @param item que o cliente deseja alugar
     * @param cliente que o representa
     * @return verdadeiro ou falso
     */
    public boolean addItemAoCliente(ItemLocacao item, Cliente cliente);

    /**
     * Muda prioridade de um item do cliente
     *
     * <p>
     * MUDAR PRIORIDADE DE ITEM: troca a prioridade de um item.
     * É passada a nova prioridade para o item, e o item que tinha a prioridade
     * requisitada passa a ter a prioridade antiga do item a requisitante.
     * </p>
     *
     * <p>
     * Exemplo:
     *   Lista de itens do Cliente A em ordem de prioridade:
     *     Jogos Mortais IV, Super Mario Kart, Tetris Revolution
     *   Após a execução do método “trocarPrioridade(Super Mario Kart, 1)” :
     *     Super Mario Kart, Jogos Mortais IV, Tetris Revolution
     * </p>
     *
     * @param cliente
     * @param item que terá a prioridade alterada
     * @param novaPrioridade, a nova prioridade do item do cliente
     * @return verdadeiro ou falso
     */
    public boolean mudarPrioridadeDeItem(Cliente cliente, ItemLocacao item, int novaPrioridade);

    /**
     * Registra a devolucao do item
     *
     * <p>
     * REGISTRAR DEVOLUCAO: o item volta a estar disponível para locação e o
     * cliente que devolve o item pode alugar novamente. Um cliente só pode
     * alugar 1 item por vez.
     * </p>
     *
     * @param item que será devolvido
     * @return verdadeiro ou falso
     */
    public boolean registrarDevolucao(ItemLocacao item);

    /**
     * Aluga item com base no item
     *
     * <p>
     * Alugar dado o item: um item é devolvido, por exemplo, e deve-se saber
     * para qual cliente ele será encaminhado. Ou seja, dado um item,
     * para qual cliente ele irá? Caso seja nenhum, a resposta deve ser “null”.
     * </p>
     *
     * @param item que será procurado na lista de interesses de todos os clientes
     * @return Cliente que possui o item na lista
     */
    public Cliente alugar(ItemLocacao item);

    /**
     * Aluga item com base no cliente
     *
     * <p>
     * Alugar dado o cliente: um cliente quer alugar um item, deve descobrir
     * qual item ser encaminhado a ele. Ou seja, dado um cliente, qual item
     * deve-se alugar para ele? Caso seja nenhum, a resposta deve ser “null”.
     * </p>
     *
     * @param cliente
     * @return Item de maior prioridade da lista de interesse
     */
    public ItemLocacao alugar(Cliente cliente);

}
